home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Source / MacTech® Magazine / Volume 11 - 1995 / 11.02 Feb 95 / 11.02 Challenge / rubik.h < prev    next >
Encoding:
C/C++ Source or Header  |  1994-12-10  |  4.5 KB  |  179 lines  |  [TEXT/KAHL]

  1. /*
  2.     MacTech Programmers Challenge - December 94
  3.  
  4.     SolveRubiksCube
  5.     Copyright (c) 1994  J Robert Boonstra
  6. */
  7. /*
  8.  * TYPEDEFS and DEFINES
  9.  */ 
  10.  
  11. typedef struct CubeSide {
  12.   char littleSquare[3][3];
  13. } CubeSide;
  14.  
  15. typedef struct MikeCube {
  16.   CubeSide face[6];
  17. } MikeCube;
  18.  
  19. /* face ordering in MikeCube */
  20. enum {kTop=0, kLeft, kFront, kRight, kBottom, kBack};
  21.  
  22. typedef struct RubiksCube {
  23.   char cubie[16][8];
  24.   char origCube[16][8];
  25.   char theMove[512];
  26. } RubiksCube, *RubiksCubePtr;
  27.  
  28. /* face ordering in RubiksCube */
  29. enum { F=0,L,R,B,U,D,f,l,r,b,u,d};
  30.  
  31. /*
  32.  * Macros Front(x) give access to individual cubies on the
  33.  * Front face.  Similarly for other faces.
  34.  */
  35. #define Front(x)  rub->cubie[x][0]
  36. #define Left(x)   rub->cubie[x][1]
  37. #define Right(x)  rub->cubie[x][2]
  38. #define Back(x)   rub->cubie[x][3]
  39. #define Up(x)     rub->cubie[x][4]
  40. #define Down(x)   rub->cubie[x][5]
  41.  
  42. /*
  43.  * Set up symbols to represent individual cubie faces
  44.  */
  45. #define ULF_F Front(0)
  46. #define UF_F  Front(1)
  47. #define URF_F Front(2)
  48. #define LF_F  Front(3)
  49. #define RF_F  Front(5)
  50. #define DLF_F Front(6)
  51. #define DF_F  Front(7)
  52. #define DRF_F Front(8)
  53.  
  54. #define ULB_L Left(0)
  55. #define UL_L  Left(1)
  56. #define ULF_L Left(2)
  57. #define LB_L  Left(3)
  58. #define LF_L  Left(5)
  59. #define DLB_L Left(6)
  60. #define DL_L  Left(7)
  61. #define DLF_L Left(8)
  62.  
  63. #define URF_R Right(0)
  64. #define UR_R  Right(1)
  65. #define URB_R Right(2)
  66. #define RF_R  Right(3)
  67. #define RB_R  Right(5)
  68. #define DRF_R Right(6)
  69. #define DR_R  Right(7)
  70. #define DRB_R Right(8)
  71.  
  72. #define DLF_D Down(0)
  73. #define DF_D  Down(1)
  74. #define DRF_D Down(2)
  75. #define DL_D  Down(3)
  76. #define DR_D  Down(5)
  77. #define DLB_D Down(6)
  78. #define DB_D  Down(7)
  79. #define DRB_D Down(8)
  80.  
  81. #define DLB_B Back(0)
  82. #define DB_B  Back(1)
  83. #define DRB_B Back(2)
  84. #define LB_B  Back(3)
  85. #define RB_B  Back(5)
  86. #define ULB_B Back(6)
  87. #define UB_B  Back(7)
  88. #define URB_B Back(8)
  89.  
  90. #define ULB_U Up(0)
  91. #define UB_U  Up(1)
  92. #define URB_U Up(2)
  93. #define UL_U  Up(3)
  94. #define UR_U  Up(5)
  95. #define ULF_U Up(6)
  96. #define UF_U  Up(7)
  97. #define URF_U Up(8)
  98.  
  99. /*
  100.  *
  101.  * Macro M(x) records the individual turns in the 
  102.  * transformation for playback during subsequent calls
  103.  * to SolveRubiksCube.
  104.  */
  105. #define M(x)   *theMoveP++ = x;
  106.  
  107. #define Rot2(a,b) \
  108. {register char tmp; tmp=a; a=b; b=tmp;}
  109.  
  110. #define Rot3(a,b,c) \
  111. {register char tmp; tmp=a; a=b; b=c; c=tmp;}
  112.  
  113. #define Rot4(a,b,c,d) \
  114. {register char tmp; tmp=a; a=b; b=c; c=d; d=tmp;}
  115.  
  116. #define Rot5(a,b,c,d,e) \
  117. {register char tmp; tmp=a; a=b; b=c; c=d; d=e; e=tmp;}
  118.  
  119. #define Rot6(a,b,c,d,e,f) \
  120. {register char tmp; tmp=a; a=b; b=c; c=d; d=e; e=f; f=tmp;}
  121.  
  122. #define Rot7(a,b,c,d,e,f,g) \
  123. {register char tmp;tmp=a;a=b;b=c;c=d;d=e;e=f;f=g;g=tmp;}
  124.  
  125. #define Rot8(a,b,c,d,e,f,g,h) \
  126. {register char tmp;tmp=a;a=b;b=c;c=d;d=e;e=f;f=g;g=h;h=tmp;}
  127.  
  128. #define Rot9(a,b,c,d,e,f,g,h,i) \
  129. {register char tmp;tmp=a;a=b;b=c;c=d;d=e;e=f;f=g;g=h;h=i; \
  130.                      i=tmp;}
  131.  
  132. #define Rot10(a,b,c,d,e,f,g,h,i,j) \
  133. {register char tmp;tmp=a;a=b;b=c;c=d;d=e;e=f;f=g;g=h;h=i; \
  134.                          i=j;j=tmp;}
  135.  
  136. #define Rot12(a,b,c,d,e,f,g,h,i,j,k,l) \
  137. {register char tmp;tmp=a;a=b;b=c;c=d;d=e;e=f;f=g;g=h;h=i; \
  138.                      i=j;j=k;k=l;l=tmp;}
  139.  
  140. #define Rot15(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) \
  141. {register char tmp;tmp=a;a=b;b=c;c=d;d=e;e=f;f=g;g=h;h=i; \
  142.                      i=j;j=k;k=l;l=m;m=n;n=o;o=tmp;}
  143.  
  144. #define Rot16(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) \
  145. {register char tmp;tmp=a;a=b;b=c;c=d;d=e;e=f;f=g;g=h;h=i; \
  146.                      i=j;j=k;k=l;l=m;m=n;n=o;o=p;p=tmp;}
  147.  
  148. #define CornerEquals(X,Y,Z,a,b,c) \
  149. ((X##Y##Z##_##X==a||X##Y##Z##_##X==b||X##Y##Z##_##X==c) && \
  150.  (X##Y##Z##_##Y==a||X##Y##Z##_##Y==b||X##Y##Z##_##Y==c) && \
  151.  (X##Y##Z##_##Z==a||X##Y##Z##_##Z==b||X##Y##Z##_##Z==c))
  152.  
  153. #define CornerCorrect(X,Y,Z) \
  154. ((X##Y##Z##_##X==X||X##Y##Z##_##X==Y||X##Y##Z##_##X==Z) && \
  155.  (X##Y##Z##_##Y==X||X##Y##Z##_##Y==Y||X##Y##Z##_##Y==Z) && \
  156.  (X##Y##Z##_##Z==X||X##Y##Z##_##Z==Y||X##Y##Z##_##Z==Z))
  157.  
  158. /*
  159.  * PROTOTYPES
  160.  */
  161. int SolveRubiksCube(RubiksCube *cubePtr);
  162. int FindSolution(void);
  163.  
  164. void MikeCubeToRubiksCube(MikeCube *mikePtr, 
  165.                                       RubiksCube *rubikPtr);
  166. void RubiksCubeToMikeCube(RubiksCube *rubikPtr, 
  167.                                       MikeCube *mikePtr);
  168. void SolveTopEdgesFR(RubiksCube *rubPtr);
  169. void SolveTopEdgesLB(RubiksCube *rubPtr);
  170. Boolean SolveTopCorners(RubiksCube *rubPtr);
  171. Boolean SolveMiddleLayer(RubiksCube *rubPtr);
  172. Boolean SolveBottomCorners(RubiksCube *rubPtr);
  173. Boolean SolveBottomEdges(RubiksCube *rubPtr);
  174. Boolean LegalCube(RubiksCube *rubPtr);
  175.  
  176. extern char *theMoveP;    /* pointer to stored moves */
  177. extern short firstTime;
  178.  
  179.